#include <iostream>
#include <sqlite3.h>

class SqliteHelper
{
public:
    typedef int(*SqliteCallback)(void*,int,char**,char**);
    // int(*)(void*,int,char**,char**)返回值为 int 类型, 接受四个参数：一个 void* 指针，一个 int，以及两个 char** 类型的指针
    // 将 int(*)(void*,int,char**,char**); 类型的函数指针重命名为SqliteCallback
    SqliteHelper(const std::string &dbfile) :_handler(nullptr), _dbfile(dbfile)
    {
    }
    bool open(int safe_leve = SQLITE_OPEN_FULLMUTEX)
    {
        int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_leve, nullptr);
        if(ret != SQLITE_OK)
        {
            std::cout << "数据库sqlite3创建/打开失败:" << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }
    void close()
    {
        if(_handler) sqlite3_close_v2(_handler); // 推荐使⽤--⽆论如何都会返回SQLITE_OK
    }

    bool exec(const std::string &sql, SqliteCallback cb, void *arg)
    {
        // arg 指定数据存储位置
        // SqliteCallback函数指针类型的回调函数
        int res = sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr);
        if(res != SQLITE_OK)
        {
            std::cout << sql << std::endl;
            std::cout << "语句执行失败:" << sqlite3_errmsg(_handler) << std::endl;
            return false;
        }
        return true;
    }

private:
    std::string _dbfile;
    sqlite3 *_handler;
};